package com.jf.car.controller;

import com.alibaba.fastjson.JSON;
import com.jf.car.util.MyUtils;
import com.jf.car.util.ResultJson;


import javax.servlet.ServletException;
import javax.servlet.annotation.MultipartConfig;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.Part;
import java.io.File;
import java.io.IOException;
import java.util.Calendar;
import java.util.HashMap;
import java.util.Map;

@WebServlet("/upload")
/*@MultipartConfig注解让servlet拥有处理文件上传的能力*/
@MultipartConfig
/*这个 Servlet 的主要功能是处理文件上传请求，依据请求参数将文件保存到指定文件夹，并返回包含文件名的 JSON 响应*/
public class UploadServlet extends HttpServlet {
    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        /*获取操作类型,不同模块上传的文件,进行不同文件夹的存储*/
        String type = request.getParameter("type");
        /*未设置操作类型则默认存入images文件夹*/
        if (MyUtils.isStringEmpty(type)){
            /*若 type 为空，就将其默认设置为 images。*/
            type="images";
        }
        /*根据表单元素的file值获取文件对象*/
        Part part = request.getPart("file");
        /*获取项目在Tomcat中的绝对地址*/
        String uploadPath =  request.getServletContext().getRealPath("/");
        /*获取当前的年月，原因是年月不会重复*/
        /*Calendar.getInstance()：获取当前的日期和时间。*/
        Calendar calendar = Calendar.getInstance();
        /*分别获取当前的年份和月份。*/
        int year = calendar.get(Calendar.YEAR);
        int month = calendar.get(Calendar.MONTH)+1;

        /*拼接存放图片的地址，最终会显示在out文件夹中*/
        String filePath = "upload/"+type+"/"+year+"/"+(month<10?"0"+month:month)+"/";

        /*地址不存在则创建,这里不创建,最后写入文件会报错*/
        File file = new File(uploadPath+filePath);
        /*验证文件夹地址是否存在*/
        if (!file.exists()){
            /*不存在则创建文件夹*/
            file.mkdirs();
        }

        /*拼接最后的文件名,用于存入数据库字段*/
        String fileName = filePath+MyUtils.getFileName()+"."+MyUtils.getFileType(part.getSubmittedFileName());
        /*拼接存入硬盘的路径*/
        String savePath = uploadPath+"/"+fileName;
        /*文件存入指定位置*/
        part.write(savePath);
        /*封装返回的JSON*/
        Map<String,String> map = new HashMap<>();
        map.put("fileName",fileName);
        /*把 Map 对象转换为 JSON 字符串，并通过 response.getWriter().println 方法将其返回给客户端。*/
        response.getWriter().println(JSON.toJSON(ResultJson.success(map)));
    }
}
